

#ifndef __CE_GFX_PROGRAM_H__
#define __CE_GFX_PROGRAM_H__

#include <asset/asset.h>
#include <gfx/enum.h>
#include <gfx/programparametername.h>
#include <string>

struct iProgramParameter;
struct iShader;
/**
 * \addtogroup shading
 * @{
 */

/**
 * @brief Interface for the representation of a shader program
 */
struct iProgram : public ceAsset
{
  CE_ASSET_ID4('p', 'r', 'o', 'g')
	iProgram () : CE_ASSET_SUPER () { }

  virtual void ClearShaders () = 0;
  virtual void AttachShader (iShader* shader) = 0;
  virtual void DetachShader (iShader* shader) = 0;
  virtual bool Link () = 0;

  virtual std::string GetLinkInfoLog () const = 0;

  virtual void Bind () = 0;

  virtual void RegisterSemantic (const ceProgramParameterName& name, const std::string& parameterName) = 0;

  virtual iProgramParameter* GetParameter(const ceProgramParameterName& name) = 0;
};


/**
 * @}
 */

#endif /* ! __CE_GFX_PROGRAM_H__ */
